/*--------------------------------*- C++ -*----------------------------------*\
| =========                 |                                                 |
| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
|  \\    /   O peration     | Version:  2.2.0                                 |
|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
|    \\/     M anipulation  |                                                 |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      topoSetDict;
}

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

actions
(
    // 创建一个cellSet，包含了构成我感兴趣的平面的所有cell
   {
        name    inletToPlaneCells; // 需要生成的集合名
        type    cellSet; // 集合类型，pointSet,pointZoneSet,faceSet...
        action  new; // 操作类型，new,add,delete,subset(交集)
        source  cylinderToCell; // 操作对象，将某圆柱内所有cell作为本次action操作对象
        sourceInfo // 操作对象信息（定义这个圆柱的几何）
        {
            p1      (-100 0 0); // point 1
            p2      (0.65 0 0); // point 2
            radius  100;
        }
    }
    // 移动cellSet中所有的面（包括内部和边界）到一个faceSet
    {
        name    inletToPlaneFaces;
        type    faceSet;
        action  new;
        source  cellToFace; // 选择cellSet中所有面
        sourceInfo
        {
        	set inletToPlaneCells; // cellSet
        	option all; // 所有
        }
    }
    // 删除所有与x方向（流向）偏差超过45度的面
    {
        name    inletToPlaneFaces;
        type    faceSet;
        action  delete; // 删除
        source  normalToFace;
        sourceInfo
        {
        	normal (0 1 0); // 选择依据的面法向
        	cos 0.5; // 允许偏差 范围[-1,1]
        }
    }
    {
        name    inletToPlaneFaces;
        type    faceSet;
        action  delete;
        source  normalToFace;
        sourceInfo
        {
        	normal (0 -1 0);
        	cos 0.5;
        }
    }
    {
        name    inletToPlaneFaces;
        type    faceSet;
        action  delete;
        source  normalToFace;
        sourceInfo
        {
        	normal (0 0 1);
        	cos 0.5;
        }
    }
    {
        name    inletToPlaneFaces;
        type    faceSet;
        action  delete;
        source  normalToFace;
        sourceInfo
        {
        	normal (0 0 -1);
        	cos 0.5;
        }
    }
    // 从faceSet中删除cellSet内部面，保留了cellSet端面
    {
        name    inletToPlaneFaces;
        type    faceSet;
        action  delete;
        source  cellToFace;
        sourceInfo
        {
        	set inletToPlaneCells;
        	option both; // 选择两个neighbour 都在cellSet中的cell（内部cell）
        }
    }
    // 现在只剩下入口平面和一个cellSet端面
    // 从faceSet删除入口平面face
    {
        name    inletToPlaneFaces;
        type    faceSet;
        action  delete;
        source  patchToFace;
        sourceInfo
        {
        	name inlet;
        }
    }
    // 转换faceSet到faceZone
    {
        name    planeFaceZone;
        type    faceZoneSet;
        action  new;
        source  setToFaceZone;
        sourceInfo
        {
            faceSet     inletToPlaneFaces;
        }
    }
);

// ************************************************************************* //
